
public class Test {
    public static void main(String[] args) {
        // Java的数据类型分两种：
        // 基本类型：byte，short，int，long，boolean，float，double，char；
        // 引用类型：所有class和interface类型。
        // 引用类型可以赋值为null，表示空，但基本类型不能赋值为null：

        // 包装类型
        // Java核心库为每种基本类型都提供了对应的包装类型：
        // boolean java.lang.Boolean
        // byte java.lang.Byte
        // short java.lang.Short
        // int java.lang.Integer
        // long java.lang.Long
        // float java.lang.Float
        // double java.lang.Double
        // char java.lang.Character

        // Auto Boxing: Java编译器可以帮助我们自动在int和Integer之间转型
        Integer n = 100; // 编译器自动使用Integer.valueOf(int)
        int x = n; // 编译器自动使用Integer.intValue()

        // 所有的包装类型都是不变类（Immutable Class），即对象创建后，其值就不能更改了：
        Integer a = 100;
        Integer b = a + 50; // 实际上是创建了一个新的Integer对象
        System.out.println(a); // 100
        System.out.println(b); // 150

        // Java的包装类型还定义了一些有用的静态变量
        Boolean t = Boolean.TRUE;
        Boolean f = Boolean.FALSE;
        System.out.println("Boolean true: " + t);
        System.out.println("Boolean false: " + f);
        // int可表示的最大/最小值:
        int max = Integer.MAX_VALUE; // 2147483647
        int min = Integer.MIN_VALUE; // -2147483648
        System.out.println("Max int: " + max);
        System.out.println("Min int: " + min);
        // 整数和浮点数的包装类型都继承自Number
        Number num = new Integer(999);
        // 获取byte, int, long, float, double等类型的值
        System.out.println("Number as byte: " + num.byteValue());
        System.out.println("Number as int: " + num.intValue());
        System.out.println("Number as long: " + num.longValue());
        System.out.println("Number as float: " + num.floatValue());
        System.out.println("Number as double: " + num.doubleValue());

        // 处理无符号整型: 在Java中，并没有无符号整型（Unsigned）的基本数据类型。byte、short、int和long都是带符号整型
        // toUnsignedInt()/toUnsignedLong(): 将一个带符号的int或long转换为无符号的int或long表示的更大类型
        int signedInt = -1;
        long unsignedInt = Integer.toUnsignedLong(signedInt);
        System.out.println("Signed int: " + signedInt);
        System.out.println("Unsigned int as long: " + unsignedInt);
    }
}
